package com.kuangstudy.controller.blog;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.kuangstudy.entity.Blog;
import com.kuangstudy.service.blog.IBlogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Optional;

/**
 * @author zhangfushuai
 * @description 主页面文章数据
 * @since 2022/4/17 18:21
 **/
@Controller
@Slf4j
public class BlogController {

    @Autowired
    private IBlogService blogService;

    /**
     * @author zhangfushuai
     * @description 跳转到添加文章页面
     * @since 2022/4/17 18:11
     * 参数
     * @return org.springframework.web.servlet.ModelAndView
     **/
    @GetMapping("/blog/add")
    public ModelAndView toAdd() {
        // 3: 定义模型视图
        ModelAndView modelAndView = new ModelAndView();
        // 2: 指定跳转的页面
        modelAndView.setViewName("blog/addAndUpdata");
        return modelAndView;
    }

    /**
     * @author zhangfushuai
     * @description 跳转到文章编辑修改页面（获取隐藏域中的文章id）
     * @since 2022/4/17 18:11
     * 参数 blogId
     * @return org.springframework.web.servlet.ModelAndView
     **/
    @GetMapping("/blog/edit/{blogId}")
    public ModelAndView toEdit(@PathVariable("blogId") Integer blogId) {
        // 1: 定义模型视图
        ModelAndView modelAndView = new ModelAndView();
        // 2: 把编辑的博客id放入到模型中
        modelAndView.addObject("blogId", blogId);
        // 2: 指定跳转的页面
        modelAndView.setViewName("blog/addAndUpdata");
        return modelAndView;
    }


    /**
     * @author zhangfushuai
     * @description 异步加载 - 根据文章id，查询对应文章
     * @since 2022/4/17 18:13
     * 参数 blogId
     * @return com.kuangstudy.entity.Blog
     **/
    @GetMapping("/api/blog/get/{blogId}")
    @ResponseBody
    public Blog geBlog(@PathVariable("blogId") Integer blogId) {
        Optional.ofNullable(blogId).orElseThrow(() -> new RuntimeException("文章找不到!!!"));
        Blog blog = blogService.getById(blogId);
        Optional.ofNullable(blog).orElseThrow(() -> new RuntimeException("文章找不到!!!"));
        return blog;
    }

    /**
     * @author zhangfushuai
     * @description 异步加载 - 新增文章，将新增文章保存到数据库
     * @since 2022/4/17 18:14
     * 参数 blog
     * @return com.kuangstudy.entity.Blog
     **/
    @PostMapping("/api/blog/saveupdate")
    @ResponseBody
    public Blog saveBlog(@RequestBody Blog blog) {
        return blogService.saveBlog(blog);
    }

    /**
     * 查询博客内容信息
     *
     * @return
     */
    /**
     * @author zhangfushuai
     * @description 异步加载 - 根据分页信息，以及当前页面选中分类对应的cid，加载首页文章的数据
     * @since 2022/4/17 18:15
     * 参数 pageNo
     * 参数 pageSize
     * 参数 cid
     * 参数 sortnum
     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.kuangstudy.entity.Blog>
     **/
    @GetMapping("/api/blog/load")
    @ResponseBody
    public Page<Blog> findBlogs(@RequestParam(required = false, defaultValue = "1") Integer pageNo,
                                @RequestParam(required = false, defaultValue = "10") Integer pageSize,
                                @RequestParam(required = false, defaultValue = "0") Integer cid,
                                @RequestParam(required = false, defaultValue = "0") Integer sortnum) {
        // 1:设置分页起始和每页显示多少条
        Page page = new Page<>(pageNo, pageSize);
        // 2:设置条件
        LambdaQueryWrapper<Blog> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 3：查询 status= 1 发布并且 isdelete=0未删除， 根据创建时间排序 desc
        lambdaQueryWrapper
                // 如果用户不传递cid或者传递的是0代表查询的全部
                .eq(cid != null && !cid.equals(0), Blog::getCategoryId, cid)
                .eq(Blog::getStatus, 1)
                .eq(Blog::getIsDelete, 0);
        if (sortnum.equals(0) || sortnum.equals(2)) {
            lambdaQueryWrapper.orderByDesc(Blog::getCreateTime);
        } else if (sortnum.equals(1)) {
            lambdaQueryWrapper.orderByAsc(Blog::getCreateTime);
        } else if (sortnum.equals(3)) {
            //自己根据条件去查询排序即可
        }
        // 4: 执行分页
        Page blogPage = blogService.page(page, lambdaQueryWrapper);
        // 5: 返回分页
        return blogPage;
    }
}
